package com.hkbigdata.sybx.utils;

import de.mkammerer.argon2.Argon2;
import de.mkammerer.argon2.Argon2Factory;
import de.mkammerer.argon2.Argon2Helper;

public class Argon2Util {
    private static final Argon2 ARGON2 = Argon2Factory.create(Argon2Factory.Argon2Types.ARGON2id);

    // 参数配置（根据服务器性能调整）
    private static final int ITERATIONS = 4;           // 迭代次数
    private static final int MEMORY = 65536;            // 内存使用 (KB)
    private static final int PARALLELISM = 2;           // 并行线程数
    private static final int HASH_LENGTH = 64;          // 哈希长度
    private static final int SALT_LENGTH = 16;          // 盐值长度

    /**
     * 哈希密码
     * @param password 明文密码
     * @return Argon2哈希字符串
     */
    public static String hash(String password) {
        try {
            return ARGON2.hash(ITERATIONS, MEMORY, PARALLELISM, password.toCharArray());
        } finally {
            // 安全清除内存中的密码副本
            ARGON2.wipeArray(password.toCharArray());
        }
    }

    /**
     * 验证密码
     * @param hash 存储的Argon2哈希
     * @param password 要验证的明文密码
     * @return 是否匹配
     */
    public static boolean verify(String hash, String password) {
        if (hash == null || hash.isEmpty()) return false;
        try {
            return ARGON2.verify(hash, password.toCharArray());
        } finally {
            // 安全清除内存中的密码副本
            ARGON2.wipeArray(password.toCharArray());
        }
    }

    /**
     * 查找最优参数（只运行一次并记录结果）
     */
    public static void findOptimalParameters() {
        // 在应用启动时运行一次，然后调整到合适的值
        int iterations = Argon2Helper.findIterations(ARGON2, 1000, MEMORY, PARALLELISM);
        System.out.println("Optimal Argon2 iterations for 1 second hash: " + iterations);
    }
}